/*题目：给定一个字符数组，代表一句完整的英文，请实现一个void split(char* str,
int len, char* delimiter) 函数，将其所有以,;?. !和空格分隔的单词分离出来并
逐行打印（像it ’s haven ’t sun ’s代表三个单词，作为单词完整打印），其中str代表
该英文句子，len代表该句子的长度，delimiter代表分隔符数组，用于存储以上标点符
号包括空格(除’外)。char delimiter []=",;? . ! ";	
char str [] = "Shining is not the sun 's patent, you also may shine .
;。			
调用样例：		
split(str, strlen (str), delimiter);	
输出样例：		
Shining
is
not
the
sun 's
patent
you
also
may
shine
*/
#include<stdio.h>  
#include<string.h>  
#include<ctype.h>  
  
void split(char* str, int len, char* delimiter);   //声明函数
  
int main(void)  
{  
    //定义两个数组
    char delimiter[] = ", ; ? . !";  
    char str[] = "Shining is not the sun's patent,you also may shine.";  
    split(str, strlen(str), delimiter);  //调用函数
    return 0;  
}  
  
// 定义调用函数  
void split(char* str, int len, char* delimiter)  
{  
    int in_word = 1; //标志位，记录单词数量
  
    for (int i = 0; i < len; i++)  
    {  
        if (isalpha(*str) || *str == '\'') //isalpha是一种函数：判断字符ch是否为英文字母，若为英文字母，返回非0（小写字母为2，大写字母为1）。若不是字母，返回0。
        {
            /*  if (!x)
                在C语言中有两种表达，这里边表示“非”。
                取决于X的值，如果X的值为0，!x就是1.
                如果X的值不为0，!x就是0的意思
            */  
            if (!in_word)  //如果不是单词则打印换行符，此处造成一个问题，如果 最开始定义in_word = 0，此处循环条件成立，会打印换行符
            {  
                printf("\n");  
                in_word = 1;  
            }  
            printf("%c", *str);  
        } 
        /*strchr 是一个在 C 语言标准库中定义的函数，用于在一个字符串中查找给定字符的首次出现位置。其函数原型为 char *strchr(const char *str, int c)。
        chr 函数的功能是在参数 str 所指向的字符串中搜索第一次出现字符 c 的位置。如果找到指定的字符，则返回该字符所在地址（即字符串中该字符的指针）；
        如果字符串中不包含该字符，则返回 NULL（空指针）。
        请注意，strchr 函数是区分大小写的，如果需要进行不区分大小写的搜索，应使用 stristr 函数。
        此外，如果 c 是一个多字节字符（例如汉字），strchr 函数只会查找其第一个字节。*/ 
        else if (strchr(delimiter, *str))  
        {  
            in_word = 0;   
        }  
        else if (*str == ' ') 
        {  
            in_word = 0;  
        }  
  
        str++;  
    }  
  
  
    if (in_word)  
    {  
        printf("\n");  
    }  
}